<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        li {
            list-style: none;
        }

        .banner {
            width: 400px;
            height: 300px;
            margin: auto;
            position: relative;
        }

        .banner ul li {
            width: 400px;
            height: 300px;
            text-align: center;
            line-height: 300px;
            font-size: 50px;
            position: absolute;
            top: 0;
            background-color: #f00;

            opacity: 0;
            transition: .5s;
        }

        span {
            width: 30px;
            height: 30px;
            text-align: center;
            line-height: 30px;
            background-color: #000;
            color: #fff;
            position: absolute;
            top: 0;
            bottom: 0;
            margin: auto;
        }

        .next {
            right: 0;
        }

        ol {
            position: absolute;
            width: 100%;
            bottom: 10px;
            display: flex;
            justify-content: center;
        }

        ol li {
            width: 20px;
            height: 20px;
            background-color: #ff0;
            margin: 10px;
        }
    </style>
</head>

<body>

    <div class="banner">
        <ul>
            <li style="opacity: 1;">1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
        <span class="prev">&lt;</span>
        <span class="next">&gt;</span>
        <ol>
            <li style="background-color: #0f0;"></li>
            <li></li>
            <li></li>
            <li></li>
        </ol>
    </div>


    <!-- <div class="banner">
        <ul>
            <li class="show">1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
        <span class="prev">&lt;</span>
        <span class="next">&gt;</span>
        <ol>
            <li class="active"></li>
            <li></li>
            <li></li>
            <li></li>
        </ol>
    </div> -->

    <script>

        // 轮播：把所有的图片定位在同一个地方，隐藏所有的图片，每次显示其中一张

        // 功能:每隔一段时间播放下一张
        //     播放第一张        1
        //     播放第二张        2
        //     播放第三张        3


        // 防止点击过快
        //    图片显示的  transition:.3s  300ms之内点击事件只能触发一次   --- 节流

        // 声明一个变量，控制播放第几张图片
        var index = 0;

        var oLis = document.querySelectorAll('ul li');
        var oDots = document.querySelectorAll('ol li');

        var oPrev = document.querySelector(".prev");
        var oNext = document.querySelector('.next');


        var t = null;

        // 节流 --- 防止点击过快
        var flag = true;



        // 自动播放
        autoPlay();


        // 上翻页
        oPrev.onclick = function () {
            if (flag) {
                flag = false;
                // 300ms图片完全显示以后，可以再次点击
                setTimeout(function () {
                    flag = true;
                }, 500)
                clearInterval(t);
                index--;
                if (index < 0) {
                    index = oLis.length - 1;
                }
                // 隐藏所有的图
                showOne();
                // 启动定时器
                autoPlay();
            }
        }

        oNext.onclick = function () {
            // 判断flag 
            clearInterval(t);
            index++;
            if (index === oLis.length) {
                index = 0;
            }
            showOne()
            // 启动定时器
            autoPlay();
        }


        // 小点切换
        for (var i = 0; i < oDots.length; i++) {
            oDots[i].index = i;
            oDots[i].onclick = function () {
                clearInterval(t);
                index = this.index;
                showOne();
            }
        }


        function autoPlay() {
            t = setInterval(function () {
                index++;
                // 播放到最后一张就回到第一张
                if (index === oLis.length) {
                    index = 0;
                }
                showOne();
            }, 2000)
        }

        // 显示一张图片
        // 显示对应的小点
        function showOne() {
            // 隐藏所有的图
            // 隐藏所有的小点
            for (var i = 0; i < oLis.length; i++) {
                oLis[i].style.opacity = 0;
                oDots[i].style.backgroundColor = '#ff0';
            }
            // 显示Index对应的这一张图
            oLis[index].style.opacity = 1;
            // 当前这个小点变成绿色
            oDots[index].style.backgroundColor = '#0f0';
        }

    </script>

</body>

</html>